import javax.swing.tree.TreeNode;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */



public class BinaryTreeCameras0108_968 {

    int res = 0;
    public int minCameraCover(TreeNode root) {
        if(traveral(root) == 0) res++;
        return res;
    }

    /**
     节点的状态值：
     0 表示无覆盖
     1 表示 有摄像头
     2 表示有覆盖
     后序遍历，根据左右节点的情况,来判读 自己的状态
     */
    private int traveral(TreeNode root) {
        if(root == null) return 2;
        int left = traveral(root.left);     // 左
        int right = traveral(root.right);   //右

        //中
        if(left == 2 && right == 2) return 0;   // 如果左右孩子节点，都是有覆盖状态，则当前节点不需要放置摄像头
        if(left == 0 || right == 0) {           // 如果左右孩子节点中，只要有一个是无覆盖状态，则当前节点需要放置摄像头
            res++;
            return 1;
        }
        if(left == 1 || right == 1){            // 如果左右孩子节点中，只要有一个是放置摄像头的状态，则当前节点就是有覆盖状态
            return 2;
        }
        return -1;//保证代码编译成功
    }




    /////////
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }


}

